package org.totoro.memory.gc;

import org.totoro.memory.MemoryChunk;

import java.util.ArrayList;
import java.util.List;

/**
 * 吞吐量优先
 * <p>
 *
 * <pre>
 *     内存区域特性回收算法介绍
 *       新生代：复制算法
 *       老年代：标记整理算法
 * </pre>
 *
 * <pre>
 *     适合场景
 *          堆内存比较小，对性能要求比较低的程序
 * </pre>
 *
 * <pre>
 *     参数介绍：
 *     -XX:+UseParallelGC      新生代采用并行垃圾回收
 *     -XX:+UseParallelOldGC   老年代采用并行垃圾回收
 *     -XX:MaxGCPauseMillis=10 每次最大gc毫秒数，
 *     -XX:GCTimeRatio=99      调整吞吐量目标：计算公式 1/(1+ratio) 例子：ration=99结果为 1/(1+99) =0.01，标识运行一个标准时间段，只能有百分之1的时间用于垃圾回收
 *     -XX:ParallelGCThreans   设置垃圾回收线程数
 *     -XX:UseAdaptiveSizePolicy JVM会根据实际运行情况动态调整新生代大小、新生代和s区比例、晋升老年代对象大小等细节参数
 * </pre>
 * <p>
 * <p>
 * vm : -Xms20m -Xmx20m  -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC -XX:+UseParallelOldGC
 *
 * @author daocr
 * @date 2020/3/8
 */
public class UseParallelTest {

    public static void main(String[] args) {
//        minorGc();
        fullGc();

    }

    /**
     * 新生代 gc 启用 -XX:+UseParallelGC 后，也会默认打开 -XX:+UseParallelOldGC
     * <pre>
     *     日志分析
     *      Minor GC                年轻代（PSYoungGen） | 前（4852K），后（480K），total（6144K）| Heap：前(4852K),后(3608K),total（19968K）
     *     [GC (Allocation Failure) [PSYoungGen: 4852K->480K(6144K)] 4852K->3608K(19968K), 0.0023253 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
     * </pre>
     * <p>
     * <p>
     * vm : -Xms20m -Xmx20m -XX:+UseParallelGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintFlagsFinal
     */
    public static void minorGc() {
        List<byte[]> list = new ArrayList<>();
        list.add(MemoryChunk._1MB.createChunk());
        list.add(MemoryChunk._2MB.createChunk());
        list.add(MemoryChunk._1MB.createChunk());
    }

    /**
     * <pre>
     *     日志分析
     *
     *      Full GC               年轻代（PSYoungGen） 前(496K)->后(0K) total(6144K)    ParOldGen： 前(13386K),后(13737K),total（13824K）Heap： 前(13882K),后(13737K),total（19968K）
     *     [Full GC (Ergonomics) [PSYoungGen: 496K->0K(6144K)] [ParOldGen: 13386K->13737K(13824K)] 13882K->13737K(19968K), [Metaspace: 3102K->3102K(1056768K)], 0.0049693 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
     * </pre>
     * vm : -Xms20m -Xmx20m -XX:+UseParallelOldGC -XX:+PrintGCDetails -verbose:gc -XX:+PrintFlagsFinal
     */
    public static void fullGc() {

        List<byte[]> list = new ArrayList<>();

        list.add(MemoryChunk._1MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
        list.add(MemoryChunk._3MB.createChunk());
    }


}
